From 814b5eef617d13e9bd4906942cea73cc6d0b9ee6 Mon Sep 17 00:00:00 2001 From: "cwc22@centipede.cl.cam.ac.uk" Date: Fri, 4 Mar 2005 11:04:09 +0000 Subject: [PATCH] bitkeeper revision 1.1236.9.2 (422840a9xbbNuTrbO6poyFnzBRcuOg) caller specified decrement to put_page_type(s) --- xen/arch/x86/mm.c | 4 ++-- xen/common/grant_table.c | 23 +++++++++++------------ xen/include/asm-x86/mm.h | 7 ++++++- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index f9d79042ce..e81413efc4 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -1060,14 +1060,14 @@ void free_page_type(struct pfn_info *page, unsigned int type) } -void put_page_type(struct pfn_info *page) +void put_page_types(struct pfn_info *page, u32 decrement) { u32 nx, x, y = page->u.inuse.type_info; again: do { x = y; - nx = x - 1; + nx = x - decrement; ASSERT((x & PGT_count_mask) != 0); diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c index edc6171f16..26ae542bd6 100644 --- a/xen/common/grant_table.c +++ b/xen/common/grant_table.c @@ -707,7 +707,8 @@ gnttab_release_all_mappings(grant_table_t *gt) grant_mapping_t *map; domid_t dom; grant_ref_t ref; - u16 handle, i; + u16 handle; + u32 pincount; struct domain *ld, *rd; unsigned long frame; active_grant_entry_t *act; @@ -733,10 +734,8 @@ gnttab_release_all_mappings(grant_table_t *gt) { if ( rd != NULL ) put_domain(rd); - /* TODO: need to be able to handle domains destroyed - * with active mappings. - */ - DPRINTK("Grant release: Could not find domain %d\n", dom); + + printk(KERN_WARNING "Grant release: Could not find domain %d\n", dom); continue; } @@ -747,16 +746,16 @@ gnttab_release_all_mappings(grant_table_t *gt) frame = act->frame; - for ( i = ((act->pin & GNTPIN_hstw_mask) >> GNTPIN_hstw_shift) + - ((act->pin & GNTPIN_devw_mask) >> GNTPIN_devw_shift); - i > 0; i-- ) - { - put_page_type(&frame_table[frame]); - } - act->pin = 0; + pincount = ((act->pin & GNTPIN_hstw_mask) >> GNTPIN_hstw_shift) + + ((act->pin & GNTPIN_devw_mask) >> GNTPIN_devw_shift); + + if ( pincount > 0 ) + put_page_types(&frame_table[frame], pincount); put_page(&frame_table[frame]); + act->pin = 0; + clear_bit(_GTF_reading, &sha->flags); clear_bit(_GTF_writing, &sha->flags); diff --git a/xen/include/asm-x86/mm.h b/xen/include/asm-x86/mm.h index 3e4b1d4b0b..75f26d54ad 100644 --- a/xen/include/asm-x86/mm.h +++ b/xen/include/asm-x86/mm.h @@ -182,9 +182,14 @@ static inline int get_page(struct pfn_info *page, return 1; } -void put_page_type(struct pfn_info *page); +void put_page_types(struct pfn_info *page, u32 decrement); int get_page_type(struct pfn_info *page, u32 type); +static inline void put_page_type(struct pfn_info *page) +{ + put_page_types(page, 1); +} + static inline void put_page_and_type(struct pfn_info *page) { put_page_type(page); -- 2.30.2